package com.tedu.API.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * RandomAccessFile解决：File无法实现读写操作
 *
 * RandomAccessFile类   随机访问文件类
 * 功能：实现”文件“、文件夹的读写操作。接近底层使用C语言，底层：二进制数据
 *
 * 创建随机访问文件类
 * RandomAccessFile   raf=new RandomAccessFile(”路径+文件全称“,"rw");
 * RandomAccessFile   raf=new RandomAccessFile(”路径+文件全称“,"r");
 * 第二个参数[mode 模式]：r 模式--->该文件可以读操作
 *                     rw 模式-->该文件可以读写操作
 * 需求：实现CV  复制音乐/视频
 */
public class RandomAccessAPI {
    @Test
    public void testRAF() throws IOException {
        //RandomAccessFile对象创建出来---路径+全称  |模式："rw"
        RandomAccessFile raf=
                new RandomAccessFile("raf.txt","rw");
        //1.在API项目文件夹下 创建 raf.txt 文件，并且实现读写操作

        //计算机  识别：二进制   0000 0000
        /**
         * 需要往raf.txt 写出一个a 字母
         * write(整数：十进制)  十进制  转换为计算机识别二进制
         *       范围：0~255   ASCII码   二进制   ---十进制---字母
         *                                          97      a
         *                                          98      b
         *                                          101     e
         * 作用：往文件中写出一个字节,抛出IO流异常：存在写出失败情况
         *      整数的低八位写出到文件中
         *       1字节==8位二进制       0000 0001     1
         *                            0000 0010     2
         *                            0000 0011     3
         *                            0000 0110     6
         *       1024字节==1KB
         *       1024KB ==1MB
         *       1024MB ==1G
         *       1024G  ==1T
         */
        raf.write(97);  //写出：一个字节，识别二进制，写十进制转二进制
        raf.write(98);
        raf.write(101);
        //write方法---一个字节一个字节写出
        //关闭流   close()
        raf.close();
    }

    /**
     * read()
     * 作用：读取一个字节，返回十进制 int类型返回，如果文件督导-1，代表结束
     *      存在IO流异常：读取可能失败~
     */
    @Test
    public void testRead() throws IOException{
        //创建对象：随机访问文件对象---只读----raf.txt文件的内容
        RandomAccessFile raf=
                new RandomAccessFile("raf.txt","r");
        int i=raf.read(); //  "a"---ASCII码---97
        int j=raf.read(); //  "b"---ASCII码---98
        int k=raf.read(); //  "e"---ASCII码---101
        int y=raf.read(); //  -1 代表 文件数据没有
        System.out.println(i+""+j+""+k+""+y);
    }

    /**
     * RAF类---构造器实现：读写操作--
     *         -write(数值)  read()  一个字节一个字节写出以及读入
     * 需求：复制粘贴一个音乐    【version 1--不考虑效率】
     */
    @Test
    public void testCV() throws IOException {
        //1.源文件--“小跳蛙.mp3”---复制---操作：读入
        RandomAccessFile src=
                new RandomAccessFile("小跳蛙(1).mp3","r");
        //2.复制文件--“新跳蛙.mp3”--粘贴---操作：写出
        RandomAccessFile desc=
                new RandomAccessFile("新跳蛙.mp3","rw");
        //3.用于保存读取到的字节： ①保存一个字节 ②-1代表文件读取到末尾
        int data=-1;
        //4.一直从”小跳蛙.mp3“中一个字节一个字节读同时取---[true]
        //  (data=src.read())!=-1        条件判断语句[true]

        long start=System.currentTimeMillis();
        //获取到当前系统时间毫秒数
        while((data=src.read())!=-1){ //一个字节一个字节--读
            //  同时一个字节一个字节写出”新跳蛙.mp3“
            desc.write(data);
        }
        long end=System.currentTimeMillis();
        System.out.println("复制粘贴花费多少："+(end-start)/1000+"毫秒");
    }
}
